package locadora.aplicacao;

import miscelanea.Data;
import locadora.negocio.produtos.*;
import locadora.negocio.pessoas.*;

public class TelaTitulo extends Tela {

	public TelaTitulo(Pessoa usuario) {
		super("Gerenciamento de títulos", usuario);
	}
	
	protected void imprimirTela() {
		while(true) {
			int opcao = -1;
			while(opcao < 0 || opcao > 3) {
				this.limpar();
				this.imprimirMensagem(this.titulo);
				this.imprimirMensagem("");
				this.imprimirMensagem("(1) Cadastrar título");
				this.imprimirMensagem("(2) Alterar dados do título");
				this.imprimirMensagem("(3) Exluir título");
				this.imprimirMensagem("");
				this.imprimirMensagem("(0) Voltar");
				this.imprimirMensagem("");
				this.requisitarEntrada("Por favor, escolha uma opção.");
				try { opcao = Integer.parseInt(this.lerEntrada()); }
				catch(Exception e) { this.imprimirErro("Opção inválida!"); }
			}
			this.limpar();
			switch(opcao) {
				case 1:	this.cadastrarItem(); break;
				case 2: this.atualizarItem(); break;
				case 3: this.removerItem(); break;
				case 0: return;
			}
		}
	}
	
	private void cadastrarItem() {
		Item item = this.novoItem();
		if(item == null) return;
		try {
			if(this.usuario instanceof Funcionario) {
				Funcionario f = (Funcionario) this.usuario;
				f.adicionar(item);
			} else if(this.usuario instanceof Gerente) {
				Gerente g = (Gerente) this.usuario;
				g.adicionar(item);
			}
		} catch(Exception e) { this.imprimirErro(e.getMessage()); }
	}
	
	private void atualizarItem() {
		this.requisitarEntrada("Por favor, insira a chave do item a ser atualizado.");
		try {
			String chave = this.lerEntrada();
			Item item = this.novoItem();
			if(item == null) return;
			if(this.usuario instanceof Funcionario) {
				Funcionario f = (Funcionario) this.usuario;
				f.atualizar(chave, item);
			} else if(this.usuario instanceof Gerente) {
				Gerente g = (Gerente) this.usuario;
				g.atualizar(chave, item);
			}
		} catch(Exception e) { this.imprimirErro(e.getMessage()); }
	}
	
	private void removerItem() {
		this.requisitarEntrada("Por favor, insira a chave do item a ser removido.");
		try {
			String chave = this.lerEntrada();
			if(this.usuario instanceof Funcionario) {
				Funcionario f = (Funcionario) this.usuario;
				f.removerItem(chave);
			} else if(this.usuario instanceof Gerente) {
				Gerente g = (Gerente) this.usuario;
				g.removerItem(chave);
			}
		} catch(Exception e) { this.imprimirErro(e.getMessage()); }
	}

	private Item novoItem() {
		int numMidias;
		Data anoLancamento;
		String titulo, descricao;
		float custo, valorAluguel;
		String tmp;
		
		this.requisitarEntrada("Por favor, insira o número de mídias do item.");
		try {
			numMidias = Integer.parseInt(this.lerEntrada());
			if(numMidias < 1) throw new Exception(); 
		} catch(Exception e) { 
			this.imprimirErro("Valor inválido para o número de mídias!");
			return null;
		}
		
		this.requisitarEntrada("Por favor, insira a data de lançamento (no formato ddmmyyyy).");
		try { 
			anoLancamento = new Data(this.lerEntrada());
		} catch(Exception e) { 
			this.imprimirErro("Data inválida!");
			return null;
		}
		
		this.requisitarEntrada("Por favor, insira o título do item.");
		tmp = this.lerEntrada();
		if(tmp.length() < 1 ) { 
			this.imprimirErro("O título não pode ficar em branco!");
			return null;
		} else {
			titulo = new String(tmp);
		}
		
		this.requisitarEntrada("Por favor, insira a descrição do item.");
		descricao = new String(this.lerEntrada());
		
		this.requisitarEntrada("Por favor, insira o custo do item.");
		try {
			custo = Float.parseFloat(this.lerEntrada());
			if(custo < 0) throw new Exception(); 
		} catch(Exception e) { 
			this.imprimirErro("Custo inválido!");
			return null;
		}

		this.requisitarEntrada("Por favor, insira o valor do aluguel do item.");
		try {
			valorAluguel = Float.parseFloat(this.lerEntrada());
			if(valorAluguel < 0) throw new Exception(); 
		} catch(Exception e) { 
			this.imprimirErro("Valor de aluguel inválido!");
			return null;
		}

		int tipo;
		this.requisitarEntrada("Por favor, selecione o tipo do item: (1) DVD, (2) VHS, (3) CD.");
		try {
			tipo = Integer.parseInt(this.lerEntrada());
			if(tipo < 1 || tipo > 3) throw new Exception(); 
		} catch(Exception e) { 
			this.imprimirErro("Opção inválida!");
			return null;
		}
		
		Item item = null;
		try {
			switch(tipo) {
				case 0:
					item = new DVD(titulo, numMidias, anoLancamento, descricao, custo, valorAluguel);
					break;
				case 1:
					item = new VHS(titulo, numMidias, anoLancamento, descricao, custo, valorAluguel);
					break;
				case 2:
					item = new CD(titulo, numMidias, anoLancamento, descricao, custo, valorAluguel);
					break;
			}
		} catch(Exception e) { this.imprimirErro(e.getMessage()); }
		
		return item;
	}
}


